package cn.itsource.ymcc.service.impl;

import cn.itsource.ymcc.common.constant.Constants;
import cn.itsource.ymcc.common.result.JsonResult;
import cn.itsource.ymcc.domain.CourseType;
import cn.itsource.ymcc.dto.CourseTypeDto;
import cn.itsource.ymcc.mapper.CourseTypeMapper;
import cn.itsource.ymcc.service.ICourseTypeService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author zcj
 * @since 2023-11-29
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * 构建树
     * @return
     */
    @Override
    public JsonResult courseTree() {
        Object o = redisTemplate.opsForValue().get(Constants.COURSE_TREE);
        if(o != null){
            return JsonResult.success().setData(o);
        }
        List<CourseType> list = super.list();
        //找顶级
        List<CourseType> top = list.stream().filter(courseType -> courseType.getPid() == 0).collect(Collectors.toList());
        //转换 对象转map
        Map<Long, CourseType> collect = list.stream().collect(Collectors.toMap(CourseType::getId, item -> item, (Key1, key2) -> Key1));
        list.stream()
                .filter(type->type.getPid() != 0)
                .forEach(type->{
            Long pid = type.getPid();
            CourseType courseType = collect.get(pid);
            courseType.getChildren().add(type);
        });
        redisTemplate.opsForValue().set(Constants.COURSE_TREE,top);
        return JsonResult.success().setData(top);
    }

    /**
     * 构建面包屑
     * @param id
     * @return
     */
    @Override
    public JsonResult breadcrumbs(Long id) {
        //当前用户选的
        CourseType byId = super.getById(id);
        //得到族谱
        String path = byId.getPath();//1037.1038.1042
        String[] split = path.split("\\.");
        List<CourseTypeDto> courseTypes = new ArrayList<>();
        for (String pid : split) {
            CourseTypeDto courseTypeDto = new CourseTypeDto();
            CourseType courseType = super.getById(pid);
            courseTypeDto.setMy(courseType);
            //找兄弟
            courseTypeDto.setBrother(super.list(new LambdaQueryWrapper<CourseType>().eq(CourseType::getPid,courseType.getPid())));
            courseTypes.add(courseTypeDto);
        }
        return JsonResult.success().setData(courseTypes);
    }

    @Override
    public boolean updateById(CourseType entity) {
        //思考？ 需求    如果是最后一个层级随便修改
        //             如果你不是最后一层级 只能修改描述
        LambdaQueryChainWrapper<CourseType> eq = super.lambdaQuery().eq(CourseType::getPid, entity.getId());
        List<CourseType> list = eq.list();
        //只要自己的id没有在pid里面出现 就证明自己是最后一层级
        if(list.size() == 0){
            super.updateById(entity);
        }else {
            String description = entity.getDescription();
            CourseType courseType = super.baseMapper.selectById(entity.getId());
            courseType.setDescription(description);
            super.updateById(courseType);
        }
        return true;
    }
}
